import requests
from bs4 import BeautifulSoup
from typing import List, Dict
from app.db.database import SessionLocal
from app.db.crud import create_tpost
from app.pacong.content_fetcher import ContentFetcher

class HackerNewsCrawler(ContentFetcher):
    """
    用于从Hacker News首页获取数据并处理的类。
    """

    def __init__(self):
        """
        初始化类实例。
        """
        self.base_url = "https://news.ycombinator.com"
        self.url = self.base_url
        self.content_type = 4  # Hacker News的source_id设为4

    def my_fetch(self) -> str:
        """
        发送HTTP GET请求，获取指定URL的HTML内容。

        :return: 返回HTML内容。
        :raises: 如果请求失败，抛出HTTPError。
        """
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        response = requests.get(self.url, headers=headers)
        response.raise_for_status()
        return response.text

    def fetch_content(self) -> List[Dict]:
        """
        从目标URL获取HTML内容，解析数据并处理。

        :return: 返回处理后的数据列表。
        """
        # 获取原始HTML数据
        html_content = self.my_fetch()
        
        # 使用BeautifulSoup解析HTML
        soup = BeautifulSoup(html_content, 'html.parser')
        news_items = soup.select('.athing')  # 选择所有新闻条目
        
        result = []
        for item in news_items:
            # 提取新闻信息
            title_element = item.select_one('.titleline a')
            if not title_element:
                continue
                
            item_id = item.get('id')
            title = title_element.text.strip()
            
            # 获取评分信息
            score_element = soup.select_one(f'#score_{item_id}')
            score = score_element.text.strip() if score_element else "0 points"
            
            # 构建讨论页面URL
            discussion_url = f"{self.base_url}/item?id={item_id}"
            
            if item_id and title:
                # 添加到结果列表
                result.append({
                    "id": item_id,
                    "title": title,
                    "url": discussion_url,
                    "extra": {
                        "info": score
                    }
                })
        
        return result


# 示例调用
if __name__ == "__main__":
    # 创建类实例
    crawler = HackerNewsCrawler()
    
    # 获取并保存数据
    crawler.fetch_and_save() 